package com.solming.leetcode.question;
//给定一个由表示变量之间关系的字符串方程组成的数组，每个字符串方程 equations[i] 的长度为 4，并采用两种不同的形式之一："a==b" 或 "a!=b"。在这里，a 和 b 是小写字母（不一定不同），表示单字母变量名。
//
//只有当可以将整数分配给变量名，以便满足所有给定的方程时才返回 true，否则返回 false
//
//来源：力扣（LeetCode）
//链接：https://leetcode-cn.com/problems/satisfiability-of-equality-equations
//著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
public class EquationsPossible {


    public static boolean equationsPossible(String[] equations) {
        int[] chars = new int[26];
        int[] size = new int[26];
        for (int i = 0; i < 26; i++) {
            chars[i] = (i);
            size[i] = 1;
        }

        for (String str : equations) {
            char c1 = str.charAt(0);
            char c2 = str.charAt(3);
            char eqFlag = str.charAt(1);
            if ('=' == eqFlag) {
                union(c1, c2, size, chars);
            }
        }
        for (String str : equations) {
            char c1 = str.charAt(0);
            char c2 = str.charAt(3);
            char eqFlag = str.charAt(1);
            if ('!' == eqFlag && connect(c1, c2,chars)) {
                return false;
            }
        }
        return true;

    }

    public static void union(char c1, char c2, int[] size, int[] chars) {
        int root1 = findRoot(c1, chars);
        int root2 = findRoot(c2, chars);
        if (size[root1] > size[root2]) {
            chars[root2] = root1;
            size[root2] += size[root1];
        } else {
            chars[root1] = root2;
            size[root1] += size[root2];
        }

    }

    public static boolean connect(char c1, char c2 ,int[] chars) {
        int root1 = findRoot(c1,chars);
        int root2 = findRoot(c2,chars);
        return root1==root2;

    }

    public static int findRoot(char c, int[] chars) {
        int x = (int) c - 97;
        while (x != chars[x]) {
            chars[x] = chars[chars[x]];
            x = chars[x];
        }
        return x;
    }

    public static void main(String[] args) {
        equationsPossible(new String[]{"a==b","b!=a"});
    }
}
